#include "stm32f10x.h"

//º궨ҥ
#define Toggle_LED3       (GPIOB->IDR&GPIO_Pin_3) ? (GPIOB->BRR=GPIO_Pin_3):(GPIOB->BSRR=GPIO_Pin_3)
#define Toggle_LED4       (GPIOB->IDR&GPIO_Pin_4) ? (GPIOB->BRR=GPIO_Pin_4):(GPIOB->BSRR=GPIO_Pin_4)

#define Toggle_BEEP       (GPIOA->IDR&GPIO_Pin_4) ? (GPIOA->BRR=GPIO_Pin_4):(GPIOA->BSRR=GPIO_Pin_4)

#define KEY1  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)
#define KEY2  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)
#define KEY3  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)
#define KEY4  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)

void delay(uint32_t count)
{
    for (uint32_t i = 0; i < count; ++i) {
        __NOP(); // 简单延时函数
    }
}


void Led_Config(void)
{
    // 1. 使能 GPIOB 时钟和 AFIO 时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;

    // 2. 取消 JTAG-DP 复用并使能 SW-DP
    AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;

    // 3. 配置 PB3 和 PB4 为推挽输出模式，速度 50MHz
    GPIOB->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3 | GPIO_CRL_MODE4 | GPIO_CRL_CNF4);
    GPIOB->CRL |= GPIO_CRL_MODE3_0 | GPIO_CRL_MODE4_0;

    // 4. 设置 PB3 和 PB4 初始状态为高电平（LED 熄灭）
    GPIOB->BSRR = GPIO_BSRR_BS3 | GPIO_BSRR_BS4;
}

void KEY_Config(void)
{
    // 1. 使能 GPIOB 时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

    // 2. 配置 PB12、PB13、PB14、PB15 为输入上拉模式
    GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_MODE13 | GPIO_CRH_MODE14 | GPIO_CRH_MODE15 |
                    GPIO_CRH_CNF12 | GPIO_CRH_CNF13 | GPIO_CRH_CNF14 | GPIO_CRH_CNF15);
    GPIOB->CRH |= GPIO_CRH_CNF12_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1 | GPIO_CRH_CNF15_1;

    // 设置 GPIOB 的输入数据寄存器上拉
    GPIOB->BSRR = GPIO_BSRR_BS12 | GPIO_BSRR_BS13 | GPIO_BSRR_BS14 | GPIO_BSRR_BS15;
}

void BEEP_Config(void)
{
    // 1. 使能 GPIOA 时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // 2. 配置 PA4 为输出推挽模式
    GPIOA->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_CNF4);
    GPIOA->CRL |= GPIO_CRL_MODE4_0;

    // 3. 设置 PA4 初始状态为低电平（蜂鸣器不响）
    GPIOA->BRR = GPIO_BRR_BR4;
}

void GPIO_Config(void)
{
	Led_Config();
	KEY_Config();
	BEEP_Config();
}


void Key_status(void)
{
	//´ú«Ӆ»¯¹ý³̣º
	//if( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) )
	//if( KEY1== 0 ) 
	//if( !KEY1 )
	if( !KEY1 || !KEY2 || !KEY3 || !KEY4 )	
	{
		delay(1000);
	
		if		( !KEY1 )	Toggle_LED3;				//LED3µƁÁ
		else if	( !KEY2 )  	GPIOB->ODR	^= GPIO_Pin_4;	//LED4µƗ´̬·­ת
		else if	( !KEY3 )  	GPIOA->ODR	^= GPIO_Pin_4;	//·䃹Ʒ״̬·­ת	
	
		while( !KEY1 ||  !KEY2 ||  !KEY3  ||  !KEY4  );
		delay(1000);
		while( !KEY1 ||  !KEY2 ||  !KEY3  ||  !KEY4  );
	}
}

int main(void)
{
    GPIO_Config();  								//µƳõʼ»¯

	while(1)
	{
		Key_status();								//°´¼ü¼첢
	}
}
